home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / strlib.zip / _STR2SET.C < prev    next >
Text File  |  1993-01-04  |  2KB  |  64 lines

  1.  
  2. /*  File   : _str2set.c
  3.     Author : Richard A. O'Keefe.
  4.     Updated: 20 April 1984
  5.     Defines: _set_ctr, _set_vec[], _str2set().
  6.     Purpose: Convert a character string to a set.
  7. */
  8.  
  9. /*  The obvious way of representing a set of characters  is  as  a
  10.     vector  of 0s and 1s.  The snag with that is that to convert a
  11.     string to such a vector, we have to clear all the elements  to
  12.     0,  and  then  set the elements corresponding to characters in
  13.     the string to 1, so the cost is  O(|alphabet|+|string|).  This
  14.     package  uses another method, where there is a vector of small
  15.     numbers and a counter.  A character is in the current  set  if
  16.     and  only  if the corresponding element of the vector is equal
  17.     to the current value of  the  counter.   Every  so  often  the
  18.     vector  elements  would  overflow  and  we  have  to clear the
  19.     vector, but the cost is reduced to O(|string|+1).
  20.  
  21.     Note that NUL ('\0') will never be in any set built by str2set.
  22.  
  23.     While this method reduces the cost of building a set, it would
  24.     be useful to avoid it entirely.  So when the "set" argument is
  25.     NullS the set is not changed.  Use NullS to mean "the same set
  26.     as before."  MaxPosChar is the largest integer value which can
  27.     be stored in a "char".  Although we might get a slightly wider
  28.     range by using "unsigned char", "char" may be cheaper (as on a
  29.     PDP-11).  By all means change the number from 127 if your C is
  30.     one of those that treats char as unsigned, but don't change it
  31.     just because _AlphabetSize is 256, the two are unrelated.  And
  32.     don't dare change it on a VAX: it is built into the asm code!
  33. */
  34.  
  35. #include "strings.h"
  36. #include "_str2set.h"
  37.  
  38. #if     CharsAreSigned
  39. #define MaxPosChar      127
  40. #else  ~CharsAreSigned
  41. #define MaxPosChar      255
  42. #endif  CharsAreSigned
  43.  
  44. int  _set_ctr = MaxPosChar;
  45. char _set_vec[_AlphabetSize];
  46.  
  47.  
  48. void _str2set(set)
  49.     register char *set;
  50.     {
  51.         if (set == NullS) return;
  52.         if (++_set_ctr == MaxPosChar+1) {
  53. #if     VaxAsm
  54.             asm("movc5 $0,4(ap),$0,$128,__set_vec");
  55. #else  ~VaxAsm
  56.             register char *w = &_set_vec[_AlphabetSize];
  57.             do *--w = NUL; while (w != &_set_vec[0]);
  58. #endif  VaxAsm
  59.             _set_ctr = 1;
  60.         }
  61.         while (*set) _set_vec[*set++] = _set_ctr;
  62.     }
  63.  
  64.